iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
生成式 AI

LLM 應用、開發框架、RAG優化及評估方法 系列 第 8

Day8 GAI爆炸時代 - LCEL 介紹

  • 分享至 

  • xImage
  •  

使用RunnableParallel 可執行多個chains並合併結果

將同一個輸入傳給不同的Runnable物件去執行,利用指名的方式
eg.
'prompt1':'{food}熱量多少
'prompt2':{food}在台灣一顆要多少錢
此時若是input為 'food':'蘋果',就可用RunnableParallel一次就將參數'food'代入到這兩個runnable(prompt1、prompt2)中去執行,就可在一個物件中,一次取得兩個不同chain的回覆

from langchain_core.runnables import RunnableParallel


find_nba_teams = RunnableParallel({
                    'intro':find_nba_chain,
                    'Goat':chainnn
                    })

print(find_nba_teams.invoke({'team':'勇士'}))

{'intro': '是的,金州勇士队(Golden State Warriors)是一支非常强的NBA球队。他们在过去十年中取得了显著的成功,包括赢得多个NBA总冠军。他们的核心球员如斯蒂芬·库里(Stephen Curry)、克莱·汤普森(Klay Thompson)和德雷蒙德·格林(Draymond Green)都非常出色,并且在过去的几个赛季中,他们也引进了一些有潜力的新球员和有经验的老将。\n\n勇士队以其快速的进攻节奏和三分球能力著称,特别是在库里的带领下,他们改变了现代篮球的一些打法和策略。虽然在某些赛季他们可能会面临伤病问题或其他挑战,但总体来说,勇士队一直是一支竞争力强、备受瞩目的球队。\n\n当然,NBA的竞争非常激烈,每个赛季都有新的挑战和变数,所以勇士队的表现也会根据不同的赛季和情况有所变化。',

'Goat': '截至2023年,金州勇士隊(Golden State Warriors)中普遍被認為最強的球員是斯蒂芬·庫里(Stephen Curry)。庫里在他的職業生涯中多次獲得MVP(最有價值球員)獎項,並且是勇士隊奪得多次NBA總冠軍的關鍵人物。\n\n庫里以其卓越的三分球投射能力和敏捷的控球技術而聞名,被認為是改變了現代籃球比賽風格的重要球員之一。他的場上表現和領導能力使他成為勇士隊的核心和靈魂人物。\n\n當然,勇士隊歷史上還有其他傑出的球員,比如克雷·湯普森(Klay Thompson)和德雷蒙德·格林(Draymond Green),但斯蒂芬·庫里無疑是當前隊中最受矚目的明星。'}

多個chain

summary_template = ChatPromptTemplate.from_template('{leader}{team}')
summary_chain = (
    {
        'leader':chainnn,
        'team':find_nba_teams
    }
    | summary_template
)

print(summary_chain.invoke({'team':'勇士'}))

messages=[HumanMessage(content="截至2023年,金州勇士隊中最強的球員普遍被認為是史蒂芬·柯瑞(Stephen Curry)。柯瑞是球隊的首發控球後衛,也是NBA歷史上最偉大的射手之一。他在三分球方面的卓越表現改變了現代籃球的打法,並且他在勇士隊的多次總冠軍奪冠中扮演了關鍵角色。此外,柯瑞多次入選全明星陣容並獲得過多次MVP(Most Valuable Player,最有價值球員)獎項。他的領導能力和技術水平使他成為勇士隊的核心和最具影響力的球員。{'intro': '截至2023年,金州勇士队(Golden State Warriors)是一支非常强大的NBA球队。他们在过去十年中取得了显著的成绩,包括以下几点:\n\n1. 总冠军:勇士队在2015年、2017年、2018年和2022年赢得了NBA总冠军,这使他们成为近年来最成功的球队之一。\n\n2. 明星球员:球队拥有多名明星球员,包括斯蒂芬·库里(Stephen Curry)、克莱·汤普森(Klay Thompson)和德雷蒙德·格林(Draymond Green),这些球员在各自的位置上都是顶尖的。\n\n3. 教练:史蒂夫·科尔(Steve Kerr)作为主教练,对球队的成功起到了关键作用。他的战术和管理风格深受球员和球迷的认可。\n\n4. 球队文化:勇士队以其团队合作和无私的打法著称,这种文化使他们不仅在进攻端非常高效,而且在防守端也表现出色。\n\n5. 创新:勇士队以其三分球战术闻名,他们通过大量的三分球投射改变了NBA的比赛风格。\n\n综上所述,金州勇士队在过去几年中表现非常强劲,且仍然是联盟中的顶尖球队之一。', 'Goat': '截至2023年,金州勇士隊中被廣泛認為最強的球員是斯蒂芬·庫里(Stephen Curry)。他在球隊中的影響力和成就讓他成為當代籃球界的頂級球星之一。庫里以其卓越的三分球能力和創紀錄的得分表現聞名,他對比賽的影響力不僅改變了勇士隊的命運,也改變了整個NBA的比賽風格。\n\n斯蒂芬·庫里在他的職業生涯中多次獲得MVP(最有價值球員)獎項,並帶領勇士隊贏得了多次NBA總冠軍。他的領導能力和場上表現無疑讓他成為勇士隊的核心和最強者。'}")]

從ChatPromptValue物件中取得content

from operator import attrgetter, itemgetter
get_messages = attrgetter('messages') # 可取得ChatPromptValue物件中的messages屬性裡的訊息串列
get_first_item  = itemgetter(0) # 取得此訊息串列中第一個角色訊息物件

print(get_messages)
print(get_first_item)
operator.attrgetter('messages')
operator.itemgetter(0)
summary = (summary_chain | get_messages | get_first_item | str_parser)
summary.invoke({'team':'勇士'})

截至2023年,金州勇士隊中最強的球員通常被認為是Stephen Curry(史蒂芬·庫里)。他是勇士隊的當家球星,也是NBA歷史上最偉大的三分射手之一。庫里在他的職業生涯中多次獲得NBA總冠軍,並多次當選為NBA全明星。他的投射能力、控球技術和比賽智商使他成為聯盟中最具影響力的球員之一。{'intro': '是的,金州勇士队(Golden State Warriors)是一支非常强的NBA球队。近年来,他们在NBA中取得了显著的成功,特别是在2010年代中期到后期。他们在2015年、2017年、2018年和2022年赢得了NBA总冠军,这让他们成为了这个时代最具统治力的球队之一。\n\n勇士队的成功很大程度上得益于他们的明星球员,如斯蒂芬·库里(Stephen Curry)、克莱·汤普森(Klay Thompson)和德雷蒙德·格林(Draymond Green)。斯蒂芬·库里尤其被认为是改变了篮球比赛的打法,因为他在三分球方面的卓越表现。\n\n此外,勇士队也有一个优秀的教练团队,史蒂夫·科尔(Steve Kerr)在2014年成为主教练后,带领球队取得了巨大的成功。\n\n当然,像所有球队一样,勇士队也经历了起伏,但他们的整体实力和团队合作使他们成为了NBA中的一支强队。', 'Goat': '截至2023年,金州勇士隊中最強的球員一般被認為是斯蒂芬·庫里(Stephen Curry)。庫里是聯盟中的頂尖射手和控球後衛,以他的三分球能力和場上領導力聞名。他在勇士隊的多次總冠軍奪冠中扮演了關鍵角色,也是兩屆NBA最有價值球員(MVP)。在他的帶領下,勇士隊成為了聯盟中最具競爭力的球隊之一。如果你對於其他球員的貢獻或表現有興趣,勇士隊還擁有克萊·湯普森(Klay Thompson)、德雷蒙德·格林(Draymond Green)等實力強勁的球員。'}"

RunnablePassthrough 簡化參數: 以字典格式與Runnable物件結合

from langchain_core.runnables import RunnablePassthrough #

r = RunnablePassthrough()
r.invoke('台北')

台北

# 原先
summary = (summary_chain | get_messages | get_first_item | str_parser)
summary.invoke({'team':'勇士'})

from langchain_core.runnables import RunnablePassthrough

summary = {'team':RunnablePassthrough()} | summary
summary.invoke('勇士')

截至2023年,金州勇士隊中最具代表性的球員之一是斯蒂芬·库里(Stephen Curry)。他被廣泛認為是當今NBA最強的射手之一,也是勇士隊的核心人物。库里以其出色的三分球和控球能力聞名,他的表現幫助勇士隊贏得了多個NBA總冠軍。他的影響力不僅在於數據上的貢獻,更在於他改變了現代籃球的比賽風格,使三分球成為比賽中的重要戰術。{'intro': '是的,金州勇士队(Golden State Warriors)在NBA中是一支非常强大的球队。近年来,他们在NBA取得了显著的成功。以下是一些关键的成就和特点:\n\n1. 总冠军:勇士队在2015年、2017年、2018年和2022年赢得了NBA总冠军。\n\n2. 核心球员:球队拥有一些非常出色的球员,如斯蒂芬·库里(Stephen Curry)、克莱·汤普森(Klay Thompson)和德雷蒙德·格林(Draymond Green),这些球员都是联盟中最顶尖的球员之一。\n\n3. 教练:史蒂夫·科尔(Steve Kerr)作为球队的主教练,自2014年上任以来,带领球队取得了巨大的成功。\n\n4. 战术风格:勇士队以其快速的进攻节奏和三分球战术闻名,他们改变了现代篮球的打法。\n\n5. 防守能力:除了进攻,他们的防守也非常出色,特别是在德雷蒙德·格林的带领下,球队的防守体系非常稳固。\n\n综上所述,金州勇士队无疑是近年来NBA中最具竞争力和观赏性的球队之一。', 'Goat': '截至2023年,金州勇士隊中最強的球員通常被認為是斯蒂芬·庫里(Stephen Curry)。庫里不僅是勇士隊的明星後衛,也是整個NBA歷史上最偉大的射手之一。他的三分球能力、球場視野和領導能力使他成為球隊的核心人物。在他的帶領下,勇士隊曾多次奪得NBA總冠軍。此外,庫里還多次入選全明星賽並獲得過MVP(最有價值球員)獎項。'}"

  • Stop : 禁用詞
chain = ({'team':RunnablePassthrough()} | prompt  | chat_model.bind(stop=['Curry']) | str_parser) # stop會禁止該詞出現
print(chain.invoke('勇士'))

是的,金州勇士队(Golden State Warriors)在NBA是非常强的球队。他们在过去的十年里取得了显著的成功。以下是一些关键的成就和特点:

  1. 总冠军:勇士队在2015年、2017年、2018年和2022年赢得了NBA总冠军。
  2. 明星球员:球队拥有一些非常出色的球员,包括斯蒂芬·库里(Stephen
from langchain_core.pydantic_v1 import BaseModel, Field
class Search(BaseModel):
    "網路搜尋工具"
    search_input: str = Field(description="應該要搜尋的關鍵字") 
    # search_input 只能存儲字符串值、Field 是來自 Pydantic 的一個函數,用於提供字段的額外元數據(metadata)

model = chat_model.bind_tools([Search]) # 將 Search 工具綁定到一個 chat_model
pprint(model.kwargs['tools'])
# 結果:
# 是定義一個名為 Search 的網路搜尋工具,並將其綁定到一個聊天模型,這樣聊天模型就可以使用這個工具進行網路搜尋

[{'type': 'function', 'function': {'name': 'Search', 'description': '網路搜尋工具', 'parameters': {'type': 'object', 'properties': {'search_input': {'description': '應該要搜尋的關鍵字', 'type': 'string'}}, 'required': ['search_input']}}}]

chain = ({'team':RunnablePassthrough()} | prompt | model)
print(chain.invoke('勇士').tool_calls)

[
{
'name': 'Search',
'args': {'search_input': 'NBA 勇士隊實力分析 2023'},
'id': 'call_1YT8TIrS2rgDsnJP5SLJtxxz',
'type': 'tool_call'
}
]
將function calling 資訊取出

from langchain.output_parsers.openai_tools import JsonOutputToolsParser
tool_parser = JsonOutputToolsParser()

chain = ({'team':RunnablePassthrough()} | prompt | model | tool_parser)
print(chain.invoke('勇士'))

[{'args': {'search_input': 'NBA 勇士隊 戰績 2023'}, 'type': 'Search'}]

以上就是這節LCEL的基本範例教學啦!!
明天要進入LCEL進階囉


上一篇
Day7 GAI爆炸時代 - LCEL 介紹
下一篇
Day9 GAI爆炸時代 - LCEL 進階介紹
系列文
LLM 應用、開發框架、RAG優化及評估方法 26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言